﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Entidades.Seguridad;
using Entidades.Sistema.Base;
using Entidades.Sistema.Venta;
using Entidades.Sistema.Produccion;
using Modelo.Sistema.Produccion;
using Modelo.Sistema.Venta;
using DevExpress.Web.ASPxEditors;
using DevExpress.Web.Mvc;

namespace VistaOnlineR1._1.Controllers.Sistema.Produccion
{
    public class RecetaController : BaseController
    {
        #region campos
        CatalogoReceta _catalogoReceta;
        CatalogoInsumo _catalogoInsumo;
        CatalogoProductos _catalogoProductos;


        #endregion 

        #region Constructors
        public RecetaController()
            : this(new CatalogoReceta(), new CatalogoInsumo(), new CatalogoProductos())
        {
        }

        public RecetaController(CatalogoReceta catalogoReceta, CatalogoInsumo catalogoInsumo, CatalogoProductos catalogoProductos)
        {
            _catalogoReceta = catalogoReceta;
            _catalogoInsumo = catalogoInsumo;
            _catalogoProductos = catalogoProductos;
        }
        #endregion

        public ActionResult Index()
        {
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.Producto = _catalogoProductos.ListarProductos();

            return View(_catalogoReceta.ListarRecetas().OrderByDescending(x => x.IdReceta));
        }

        [ValidateInput(false)]
        public ActionResult EditRecetaPartial()
        {
            List<Perfil> perfiles = RecuperarPerfil();

            string idsession = "Receta";
            Receta oReceta = new Receta();
            System.Web.HttpContext.Current.Session[idsession] = oReceta;

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.Producto = _catalogoProductos.ListarProductos();

            return PartialView("EditRecetaPartial", _catalogoReceta.ListarRecetas().OrderByDescending(x => x.IdReceta));
        }
        public ActionResult EditRecetaAddNewPartial(Receta RecetaEdit)
        {
            int ret = 0;
            string idsession = "Receta";

            ModelState.Clear();
            if (ModelState.IsValid)
            {
                RecetaEdit.Producto = _catalogoProductos.BuscarProducto(RecetaEdit.Producto.IdProducto);
                RecetaEdit.Estado = "Habilitada";
                RecetaEdit.FechaAlta = DateTime.Today;

                Receta oReceta = (Receta)System.Web.HttpContext.Current.Session[idsession];

                if (oReceta.RecetaDetalles.Count > 0)
                {
                    foreach (RecetaDetalle det in oReceta.RecetaDetalles)
                    {
                        RecetaEdit.AgregarDetalle(det);
                    }
                    if (RecetaEdit.Predeterminada == true)
                    {
                        if (_catalogoReceta.ListarRecetas().Any(x => x.Producto.IdProducto == RecetaEdit.Producto.IdProducto && x.Predeterminada == true))
                        {
                            List<Receta> list = _catalogoReceta.ListarRecetas().Where(x => x.Producto.IdProducto == RecetaEdit.Producto.IdProducto && x.Predeterminada == true).ToList();

                            foreach (Receta rec in list)
                            {
                                rec.Predeterminada = false;
                                _catalogoReceta.ModificarReceta(rec);
                            }
                        }
                    }
                    ret = _catalogoReceta.AgregarReceta(RecetaEdit);
                }
                else
                {
                    ViewData["RecetaEdit"] = RecetaEdit;
                    ViewData["EditError"] = "No existe detalle para el Receta.";
                }               
                
            }
            else
            {
                ViewData["RecetaEdit"] = RecetaEdit;
                ViewData["EditError"] = "Por Favor, modifica los errores.";
            }

            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.Producto = _catalogoProductos.ListarProductos();
            ViewData["Receta"] = ret;

            return PartialView("EditRecetaPartial", _catalogoReceta.ListarRecetas().OrderByDescending(x => x.IdReceta));
        }
        public ActionResult EditRecetaUpdatePartial([ModelBinder(typeof(DevExpressEditorsBinder))] Receta RecetaEdit)
        {

            ModelState.Clear();
            if (ModelState.IsValid)
            {
                Receta oRecetaUpdate = _catalogoReceta.BuscarReceta(RecetaEdit.IdReceta);

                oRecetaUpdate.Producto = _catalogoProductos.BuscarProducto(RecetaEdit.Producto.IdProducto);
                oRecetaUpdate.Nombre = RecetaEdit.Nombre;
                oRecetaUpdate.Predeterminada = RecetaEdit.Predeterminada;
                oRecetaUpdate.Descripcion = RecetaEdit.Descripcion;

                if (oRecetaUpdate.Predeterminada == true)
                {
                    if (_catalogoReceta.ListarRecetas().Any(x => x.Producto.IdProducto == oRecetaUpdate.Producto.IdProducto && x.Predeterminada == true))
                    {
                        List<Receta> list = _catalogoReceta.ListarRecetas().Where(x => x.Producto.IdProducto == oRecetaUpdate.Producto.IdProducto && x.Predeterminada == true).ToList();

                        foreach (Receta rec in list)
                        {
                            rec.Predeterminada = false;
                            _catalogoReceta.ModificarReceta(rec);
                        }
                    }
                    oRecetaUpdate.Predeterminada = true;
                }

                _catalogoReceta.ModificarReceta(oRecetaUpdate);
            }
            else
            {
                ViewData["EditError"] = "No se pudieron guardar los cambio. Exiten errores!";
                ViewData["RecetaEdit"] = RecetaEdit;
            }

            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");
            ViewBag.Producto = _catalogoProductos.ListarProductos();

            return PartialView("EditRecetaPartial", _catalogoReceta.ListarRecetas().OrderByDescending(x => x.IdReceta));
        }
        public ActionResult EditRecetaDeletePartial(int IdReceta)
        {
            _catalogoReceta.EliminarReceta(_catalogoReceta.BuscarReceta(IdReceta));
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.Producto = _catalogoProductos.ListarProductos();

            return PartialView("EditRecetaPartial", _catalogoReceta.ListarRecetas().OrderByDescending(x => x.IdReceta));
        }
        public ActionResult EditRecetaCancelPartial(int IdReceta)
        {
            if (IdReceta != -1)
            {
                _catalogoReceta.RecetaCancelarEdicion(IdReceta);
            }            
            List<Perfil> perfiles = RecuperarPerfil();

            ViewBag.PermisoDelete = perfiles.Exists(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCreate = perfiles.Exists(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEdit = perfiles.Exists(per => per.Permiso.Nombre == "Edit");

            ViewBag.Producto = _catalogoProductos.ListarProductos();

            return RedirectToAction("Index");
        }

        public ActionResult EditRecetaDetallePartial(int IdReceta)
        {
            ViewBag.Insumo = _catalogoInsumo.ListarInsumos();
            ViewData["IdReceta"] = IdReceta;

            string idsession = "Receta";
            Receta oReceta = new Receta();
            oReceta = (Receta)System.Web.HttpContext.Current.Session[idsession];

            if (IdReceta != 0)
            {
                //hacer tod en un if
                if (oReceta == null)
                {
                    oReceta = _catalogoReceta.BuscarReceta(IdReceta);
                }
                else if (oReceta.IdReceta != IdReceta)
                {
                    oReceta = _catalogoReceta.BuscarReceta(IdReceta);
                }
            }
            else if (oReceta == null)
            {
                oReceta = new Receta();
            }
            System.Web.HttpContext.Current.Session[idsession] = oReceta;

            return PartialView("EditRecetaDetallePartial", oReceta.RecetaDetalles);
        }
        public ActionResult EditRecetaDetalleAddNewPartial([ModelBinder(typeof(DevExpressEditorsBinder))] RecetaDetalle det, int IdReceta)
        {
           
            ViewData["IdReceta"] = IdReceta;
            string idsession = "Receta";
            Receta oReceta = new Receta();
            oReceta = (Receta)System.Web.HttpContext.Current.Session[idsession];

            if (ModelState.IsValid)
            {
                if (oReceta.RecetaDetalles.Any(x => x.Insumo.IdInsumo == det.Insumo.IdInsumo))
                {
                    ViewData["EditError"] = "El Insumo selecciona ya existe en la lista.";
                }
                else
                {
                    det.Insumo = _catalogoInsumo.BuscarInsumo(det.Insumo.IdInsumo);
                    det.IdRecetaDetalle = det.Insumo.IdInsumo;
                    oReceta.RecetaDetalles.Add(det);
                }
            }
            else
            {
                ViewData["EditError"] = "Por Favor, modifica los errores.";
            }

            System.Web.HttpContext.Current.Session[idsession] = oReceta;
            ViewBag.Insumo = _catalogoInsumo.ListarInsumos();

            return PartialView("EditRecetaDetallePartial", oReceta.RecetaDetalles);
        }
        public ActionResult EditRecetaDetalleUpdatePartial([ModelBinder(typeof(DevExpressEditorsBinder))] RecetaDetalle det, int IdReceta)
        {
            string idsession = "Receta";
            Receta oReceta = (Receta)System.Web.HttpContext.Current.Session[idsession];
            ModelState.Clear();

            if (ModelState.IsValid)
            {
                oReceta.RecetaDetalles.Remove(oReceta.RecetaDetalles.FirstOrDefault(x => x.IdRecetaDetalle == det.IdRecetaDetalle));
                det.Insumo = _catalogoInsumo.BuscarInsumo(det.Insumo.IdInsumo);
                det.IdRecetaDetalle = det.Insumo.IdInsumo;
                oReceta.RecetaDetalles.Add(det);
            }
            else
            {
                ViewData["EditError"] = "Por Favor, modifica los errores.";
            }

            System.Web.HttpContext.Current.Session[idsession] = oReceta;
            ViewData["IdReceta"] = IdReceta;
            ViewBag.Insumo = _catalogoInsumo.ListarInsumos();

            return PartialView("EditRecetaDetallePartial", oReceta.RecetaDetalles);
        }
        public ActionResult EditRecetaDetalleDeletePartial(int IdRecetaDetalle, int IdReceta)
        {
            ViewData["IdReceta"] = IdReceta;
            ViewBag.Insumo = _catalogoInsumo.ListarInsumos();
            string idsession = "Receta";
            Receta oReceta = (Receta)System.Web.HttpContext.Current.Session[idsession];

            oReceta.RecetaDetalles.Remove(oReceta.RecetaDetalles.FirstOrDefault(x => x.IdRecetaDetalle == IdRecetaDetalle));
            System.Web.HttpContext.Current.Session[idsession] = oReceta;

            return PartialView("EditRecetaDetallePartial", oReceta.RecetaDetalles);
        }

    }
}
